#include "ioregisters.h"

namespace NRP6SimulGlue {

TIORegisterSetCB CIORegister::setCallback = 0;
TIORegisterGetCB CIORegister::getCallback = 0;

}

#define DEFINE_REGISTER(R) NRP6SimulGlue::CIORegister R(NRP6SimulGlue::IO_##R)

// Timer0
DEFINE_REGISTER(TCCR0);
DEFINE_REGISTER(OCR0);

// Timer1
DEFINE_REGISTER(TCCR1A);
DEFINE_REGISTER(TCCR1B);
DEFINE_REGISTER(OCR1A);
DEFINE_REGISTER(OCR1B);
DEFINE_REGISTER(OCR1AL);
DEFINE_REGISTER(OCR1AH);
DEFINE_REGISTER(OCR1BL);
DEFINE_REGISTER(OCR1BH);
DEFINE_REGISTER(ICR1);

// Timer2
DEFINE_REGISTER(TCCR2);
DEFINE_REGISTER(OCR2);

// TIMSK
DEFINE_REGISTER(TIMSK);

// UART
DEFINE_REGISTER(UCSRA);
DEFINE_REGISTER(UCSRB);
DEFINE_REGISTER(UCSRC);
DEFINE_REGISTER(UDR);
DEFINE_REGISTER(UBRR);
DEFINE_REGISTER(UBRRL);
DEFINE_REGISTER(UBRRH);

// General IO ports
DEFINE_REGISTER(PORTA);
DEFINE_REGISTER(PORTB);
DEFINE_REGISTER(PORTC);
DEFINE_REGISTER(PORTD);
DEFINE_REGISTER(DDRA);
DEFINE_REGISTER(DDRB);
DEFINE_REGISTER(DDRC);
DEFINE_REGISTER(DDRD);
DEFINE_REGISTER(PINA);
DEFINE_REGISTER(PINB);
DEFINE_REGISTER(PINC);
DEFINE_REGISTER(PIND);

// ADC
DEFINE_REGISTER(ADMUX);
DEFINE_REGISTER(ADCSRA);
DEFINE_REGISTER(SFIOR);
DEFINE_REGISTER(ADC);

// External timers
DEFINE_REGISTER(MCUCR);
DEFINE_REGISTER(GICR);
DEFINE_REGISTER(MCUCSR);

// SPI
DEFINE_REGISTER(SPCR);
DEFINE_REGISTER(SPSR);
DEFINE_REGISTER(SPDR);

// TWI
DEFINE_REGISTER(TWBR);
DEFINE_REGISTER(TWCR);
DEFINE_REGISTER(TWSR);
DEFINE_REGISTER(TWDR);
DEFINE_REGISTER(TWAR);


#undef DEFINE_REGISTER
